//package com.growthserver.util;
//
//import com.google.gson.*;
//import com.google.gson.reflect.TypeToken;
//import org.apache.commons.lang3.ArrayUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.commons.lang3.math.NumberUtils;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * JSONUtil
// */
//public class JSONUtil {
//
//	private static Gson gson = null;
//
//	static{
//		gson  = new Gson();//yyyy-MM-dd HH:mm:ss
//	}
//
//	public static Gson getGson(){
//		return gson;
//	}
//
//	public static boolean isValidJsonObjectString(String jsonStr){
//		try{
//
//			getGson().fromJson(jsonStr, Map.class);
//
//			return true;
//
//		}catch (Throwable e){
//
//			return false;
//
//		}
//	}
//
//	public static String evalString(Object data, String path){
//
//		path = StringUtils.isBlank(path) ? "$" : path.startsWith("$") ? path : ("$." + path);
//
//		return recursiveEval(data, path.split("\\."), String.class);
//
//	}
//
//	/**
//	 *
//	 * @param data json字符串
//	 * @param path 解析路径 路径以$开头, $.key表示解析根集里字段为key的数据
//	 * @param clz 目标字段结果type类
//	 * @param <T> 目标字段
//	 * @return
//	 */
//	public static <T> T eval(Object data, String path, Class<T> clz){
//
//		path = StringUtils.isBlank(path) ? "$" : path.startsWith("$") ? path : ("$." + path);
//
//		try{
//
//            return recursiveEval(data, path.split("\\."), clz);
//
//        }catch(Throwable e){
//
//            e.printStackTrace();
//
//		    return null;
//
//        }
//
//	}
//
//	private static <T> T recursiveArrayEval(Object data, String[] evalPaths, Class<T> clz){
//
//		if(null == data){
//			return null;
//		}
//
//		JsonElement jsonElement = new JsonParser().parse(data.toString());
//
//		String evalExpression = 1 == evalPaths.length ? evalPaths[0] : evalPaths[1];
//
//		String arrayKey = evalExpression.substring(0, evalExpression.indexOf("["));
//
//		String arrayIndexStr = evalExpression.substring(evalExpression.lastIndexOf("[") + 1, evalExpression.lastIndexOf("]"));
//
//		if(evalPaths.length == 1){
//			return getGson().fromJson(jsonElement.getAsJsonArray().get(NumberUtils.toInt(arrayIndexStr)), clz);
//		}
//
//		if(evalPaths.length >= 3){
//			jsonElement = jsonElement.getAsJsonObject().get(arrayKey).getAsJsonArray().get(NumberUtils.toInt(arrayIndexStr));
//			return recursiveEval(jsonElement, ArrayUtils.subarray(evalPaths, 1, evalPaths.length), clz);
//		}
//
//		jsonElement = jsonElement.getAsJsonObject().get(arrayKey);
//
//		return recursiveEval(jsonElement, ArrayUtils.subarray(evalPaths, 1, evalPaths.length), clz);
//
//	}
//
//	private static <T> T recursiveEval(Object data, String[] evalPaths, Class<T> clz){
//
//		if(null == data){
//			return null;
//		}
//
//        JsonElement jsonElement = new JsonParser().parse(data.toString());
//
//        String evalExpression = 1 == evalPaths.length ? evalPaths[0] : evalPaths[1];
//
//		if(1 == evalPaths.length){
//
//			if(isArrayExpression(evalExpression)){
//				return recursiveArrayEval(data, evalPaths, clz);
//			}
//
//			return getGson().fromJson(jsonElement, clz);
//
//		}
//
//		if(isArrayExpression(evalExpression)){
//			return recursiveArrayEval(data, evalPaths, clz);
//		}
//
//		jsonElement = jsonElement.getAsJsonObject().get(evalExpression);
//
//		return recursiveEval(jsonElement, ArrayUtils.subarray(evalPaths, 1, evalPaths.length), clz);
//
//	}
//
//	private static boolean isArrayExpression(String expression){
//		return expression.contains("[") && expression.contains("]");
//	}
//
//	public static String toJsonString(Object srcObj) {
//		return toJson(srcObj);
//	}
//
//	public static String toJson(Object obj){
//		return gson.toJson(obj);
//	}
//
//	public static <T> T toBean(String json, Class<T> clz){
//
//		return gson.fromJson(json, clz);
//	}
//
//	public static <T> Map<String, T> toMap(String json, Class<T> clz){
//		 Map<String, JsonObject> map = gson.fromJson(json, new TypeToken<Map<String, JsonObject>>(){}.getType());
//		 Map<String, T> result = new HashMap<>();
//		 for(String key:map.keySet()){
//			 result.put(key,gson.fromJson(map.get(key),clz) );
//		 }
//		 return result;
//	}
//
//	public static Map<String, Object> toMap(String json){
//		 Map<String, Object> map = gson.fromJson(json, new TypeToken<Map<String, Object>>(){}.getType());
//		 return map;
//	}
//
//	public static <T> List<T> toList(String json, Class<T> clz){
//		JsonArray array = new JsonParser().parse(json).getAsJsonArray();
//		List<T> list  = new ArrayList<>();
//		for(final JsonElement elem : array){
//	         list.add(gson.fromJson(elem, clz));
//	    }
//	    return list;
//	}
//
//}
